//
//  Status.swift
//  HMWeibo06
//
//  Created by apple on 15/5/17.
//  Copyright (c) 2015年 heima. All rights reserved.
//

import UIKit
import SDWebImage

/// 加载首页的 URL 地址
private let WB_HOME_LINE_URL = "https://api.weibo.com/2/statuses/friends_timeline.json"

class Status: NSObject {
   
    // 微博创建时间
    var created_at: String?
    // 微博ID
    var id: Int = 0
    // 微博的正文
    var text: String?
    // 微博来源
    var source: String?
    // 配图数组
    var pic_urls: [[String: String]]? {
        didSet {
            // 实例化数组
            imageURLs = [NSURL]()
            
            for dict in pic_urls! {
                if let url = NSURL(string: dict["thumbnail_pic"]!) {
                    imageURLs?.append(url)
                }
            }
        }
    }
    
    // 配图的 URL 数组
    var imageURLs: [NSURL]?
    
    // 如果是转发的微博，原创微博没有配图
    // 定义一个计算型属性，如果是原创微博，返回原创微博的图片 URL
    // 如果是转发微博，返回转发微博的图片 URL
    var pictureURLs: [NSURL]? {
        // 判断是否是转发微博
        if retweeted_status != nil {
            return retweeted_status?.imageURLs
        } else {
            return imageURLs
        }
    }
    
    // 用户记录
    var user: User?
    // 转发微博记录（同样是一个微博数据）
    var retweeted_status: Status?
    
    // 属性数组
    private static let properties = ["created_at", "id", "text", "source", "pic_urls"]
    
    /**
    加载微博数据
    */
    class func loadStatus(completion:(statuses: [Status]?)->()) {
        
        let params = ["access_token": sharedUserAccount!.access_token]
        
        NetworkTools.requestJSON(.GET, URLString: WB_HOME_LINE_URL, parameters: params) { (JSON) -> () in
            if JSON != nil {
                // 提取 statuses key 对应的数组
                if let array = (JSON as! NSDictionary)["statuses"] as? [[String: AnyObject]] {
                    
                    let result = self.statuses(array)
                    
                    self.cacheStatusImages(result, completion: completion)
                    
                    return
                }
            }
            completion(statuses: nil)
        }
    }
    
    /**
    注意事项：
    1. enter 和 leave 必须成对出现
    2. enter 之后的 block 异步，就会收到群组的监听
    void
    dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
    {
        dispatch_retain(group);
        // 进入群组
        dispatch_group_enter(group);
        dispatch_async(queue, ^{
            block();
            // 离开群组
            dispatch_group_leave(group);
            dispatch_release(group);
        });
    }
    */
    
    /**
    缓存所有图片
    */
    private class func cacheStatusImages(statuses: [Status]?, completion:(statuses: [Status]?)->()) {
    
        if statuses?.count == 0 {
            return
        }
        
        // 建立一个 dispatch_group，可以监听一组异步任务完成后，统一得到通知
        let group = dispatch_group_create()
        
        // 遍历微博数据数组
        for s in statuses as [Status]! {
            // 没有图片继续循环
            if s.pictureURLs == nil {
                continue
            }
            
            // 遍历图片 url 数组，下载图像
            for url in s.pictureURLs! {
                // downloadImageWithURL 本身会下载图片，并且完成缓存
                // 回调参数，通常是有 UI 交互才会使用的
                
                // 1> 进入群组
                dispatch_group_enter(group)
                // SDWebImage 下载图像前，会检查本地是否存在图片缓存，如果存在，会直接返回，不会去网络上加载
                // 速度快，效率高！
                // 如果要判断服务器的图片是否更改，可以使用 RefreshCached 选项
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: nil, progress: nil, completed: { (_, _, _, _, _) in
                    
                    // 2> 离开群组，一定要放在 block 的最后一句，表示异步真正执行完成
                    dispatch_group_leave(group)
                })
            }
        }
        
        // 3. 监听群组调度
        dispatch_group_notify(group, dispatch_get_main_queue(), { () -> Void in
            println("图片缓存完成+加载数据 \(NSHomeDirectory())")
            // 执行回调
            completion(statuses: statuses)
        })
    }
    
    // 将字典数组转换成 微博 数组
    private class func statuses(array: [[String: AnyObject]]) -> [Status]? {
        
        if array.count == 0 {
            return nil
        }
        
        // 实例化一个可变的数组
        var arrayM = [Status]()
        
        for dict in array {
            arrayM.append(Status(dict: dict))
        }
        
        return arrayM
    }
    
    // 字典转模型，init 函数中，不用写 return
    init(dict: [String: AnyObject]) {
        // 实例化对象
        super.init()
        
        // 使用 KVC 设置数值
        for key in Status.properties {
            if dict[key] != nil {
                // 在 swift 中，如果在 构造函数中使用 KVC，需要先 super.init，确保对象被实例化
                setValue(dict[key], forKeyPath: key)
            }
        }
        
        // 单独处理一下 user
        if dict["user"] != nil {
            user = User(dict: dict["user"] as! [String: AnyObject])
        }
        
        // 单独处理转发微博
        if dict["retweeted_status"] != nil {
            retweeted_status = Status(dict: dict["retweeted_status"] as! [String: AnyObject])
        }
    }
}
